package Groep1;

/**
 * Een <code>Token</code> is een stuk tekst die de scanner heeft herkend.
 */
class Token implements TokenKinds {

    /**
     * Het soort van dit token.
     * @see TokenKinds
     */
    private int kind;

    /**
     * De herkende tekst van dit token.
     */
    private String text;

    /**
     * Het regelnummer waar het token eindigt.
     */
    private int line;

    /**
     * Het kolomnummer waar het token eindigt.
     */
    private int column;

    /**
     * Construeer nieuw (tekstloos) token.
     * @param kind soort token
     * @param line regelnummer
     * @param column kolomnummer
     */
    public Token(int kind,int line,int column) {
        this(kind,line,column,"");
    }

    /**
     * Construeer nieuw token.
     * @param kind soort token
     * @param line regelnummer
     * @param column kolomnummer
     * @param tekst token tekst
     */
    public Token(int kind,int line,int column,String text) {
        assert line>0 && column>0;
        assert text!=null;

        this.kind=kind;
        this.text=text;
        this.line=line;
        this.column=column;
    }

    /**
     * Verkrijg het soort van dit token.
     * @return een identificatie van een token soort
     * @see TokenKinds
     */
    public int getKind() {
        return kind;
    }

    /**
     * Verkrijg de tekst behorende bij dit token.
     * @return een string
     */
    public String getText() {
        return text;
    }

    /**
     * Verkrijg het kolomnummer waar dit token eindigt.
     * @return een integer
     */
    public int getColumn() {
        return column;
    }

    /**
     * Verkrijg het regelnummer waar dit token eindigt.
     * @return een integer
     */
    public int getLine() {
        return line;
    }

    public String kindToString(int kind) {
        switch(kind) {
        case -1:
            return "EOF";
        case 1:
            return "OR";
        case 2:
            return "TERMINAL";
        case 3:
            return "NONTERMINAL";
        case 4:
            return "ASSIGNMENT";
        case 5:
            return "EOL";
        }
        return "";
    }

    /**
     * Verkrijg een string representatie van dit token.
     * @return een string met daarin soort, regel-, kolomnummer en tekst
     */
    public String toString() {
        return new StringBuffer()
               .append("Token ")
               .append(kindToString(kind))
               .append(" line/column: ")
               .append(line).append('/').append(column)
               .append(" text:")
               .append('"').append(text).append('"')
               .toString();
    }
}
